#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <time.h>
#include <dirent.h>
#include <sys/stat.h>
#include "../libraries/arquivos.h"
#include "../libraries/sistema.h"


struct x{

	char *nome;
	struct tm data;

};

int main(int argc, char * argv[], char * envp[])
{
	int dt;
	char * dir1;
	char * dir2;
	char * arquivos[BUFFER_SIZE];
	char * dirFinal;
	int * numArqs;
	char * temp;
	int i = 0;

	int achou = FALSE;
	
	numArqs = malloc(sizeof(int));
	dir1 =	malloc(sizeof(argv[1]));
	dir2 = malloc(sizeof(argv[2]));
	dirFinal = malloc(sizeof(char)*200);
	temp = malloc(sizeof(char)*200);

	if (argc != 4){ perror("Argumentos inválidos!\nUse: bckp dir1 dir2 dt\n"); exit(1); }
	dir1 = argv[3];
	dt = atoi(dir1);
	dir2 = argv[2];	
	dir1 = argv[1];

	void (*oldhandler)(int);
	oldhandler = signal(SIGUSR1, SIG_IGN);
	//	FULL BACKUP
	if(!SISTEMA_diretorio(dir2, dirFinal)) exit(1);
	if(!ARQUIVOS_lista(dir1, numArqs, arquivos)) exit(2);
	if(!SISTEMA_mkbckinfo(dir1, dirFinal)) exit(3);	
	
	for(i = 0; i < *numArqs; i++)
	{
		// Junta pathDir1 + nomedoArquivo[i]		
		sprintf(temp,"%s/%s", dir1, arquivos[i]);
		// Copia de temp (pathDir1 + nomeDoArquiv[count]) para diRfinal (pathDir2 + systemTime)	
		if(!ARQUIVOS_copia(temp, dirFinal)) exit(4);
	}

	//	INCREMENTAL BACKUP

	while(TRUE)
	{

		DIR *diretorio;
		struct dirent *dirt;
		struct stat attrib;
		struct tm *arq;
		struct x var[100];
		int i = 0;
		diretorio = opendir(dir1);

		while((dirt = readdir(diretorio)) != NULL){

			if(dirt->d_type == DT_REG)
			{
				sprintf(temp, "%s/%s", dir1, dirt->d_name);
				var[i].nome = dirt->d_name;
				stat(temp, &attrib);
				arq = gmtime(&(attrib.st_mtime));
				var[i].data = *arq;
				i++;
			}
		}
		closedir(diretorio);

		signal(SIGUSR1, oldhandler);				
		sleep(dt);			
		oldhandler = signal(SIGUSR1, SIG_IGN);
		
		if(!SISTEMA_diretorio(dir2, dirFinal)) exit(1);
		if(!ARQUIVOS_lista(dir1, numArqs, arquivos)) exit(2);
		if(!SISTEMA_mkbckinfo(dir1, dirFinal)) exit(3);

		int j = 0;
		diretorio = opendir(dir1);

		while((dirt = readdir(diretorio)) != NULL){

			if(dirt->d_type == DT_REG)
			{
				sprintf(temp, "%s/%s", dir1, dirt->d_name);
				stat(temp, &attrib);
				arq = gmtime(&(attrib.st_mtime));
				for(j = 0; j < i; j++){
					if(strcmp(var[j].nome, dirt->d_name) == 0){
						printf("%s\n", dirt->d_name);
						achou = TRUE;
						if(var[j].data.tm_year < (*arq).tm_year){
							sprintf(temp,"%s/%s", dir1, dirt->d_name);
							if(!ARQUIVOS_copia(temp, dirFinal)) exit(4);
						} else if(var[j].data.tm_mon < (*arq).tm_mon){
							sprintf(temp,"%s/%s", dir1, dirt->d_name);
							if(!ARQUIVOS_copia(temp, dirFinal)) exit(4);
						} else if(var[j].data.tm_mday < (*arq).tm_mday){
							sprintf(temp,"%s/%s", dir1, dirt->d_name);
							if(!ARQUIVOS_copia(temp, dirFinal)) exit(4);
						} else if(var[j].data.tm_hour < (*arq).tm_hour){
							sprintf(temp,"%s/%s", dir1, dirt->d_name);
							if(!ARQUIVOS_copia(temp, dirFinal)) exit(4);
						} else if(var[j].data.tm_min < (*arq).tm_min){
							sprintf(temp,"%s/%s", dir1, dirt->d_name);
							if(!ARQUIVOS_copia(temp, dirFinal)) exit(4);
						} else if(var[j].data.tm_sec < (*arq).tm_sec){
							sprintf(temp,"%s/%s", dir1, dirt->d_name);
							if(!ARQUIVOS_copia(temp, dirFinal)) exit(4);
						}
						continue;
					}
				}
				if(achou == FALSE){
					sprintf(temp,"%s/%s", dir1, dirt->d_name);
					if(!ARQUIVOS_copia(temp, dirFinal)) exit(4);
				} 
			}
		}
		achou = FALSE;
		closedir(diretorio);
	}
	exit(0);        
}


